const express = require("express");
const util = require("../common/util");
const ShelvesDB = require('../model/db/shelves');

/**
 * 增加货架
 */
async function add(req, res) {
    try {
        // 创建一个符合数据库模型的货架对象
        const shelve = {
            warehouseZoneId: req.body.warehouseZoneId,
            shelfNumber: req.body.shelfNumber, 
            layers: req.body.layers,
            shelfType: req.body.shelfType,
            shelfSize: req.body.shelfSize,
            shelfCapacity: req.body.shelfCapacity,
            shelfStatus:req.body.shelfStatus,  
            shelfLocation: req.body.shelfLocation ,
            description: req.body.description , 
            photoUrl: req.body.photoUrl 
        };

        // 获取数据库操作实例
        const db = ShelvesDB.getInstance();

        // 执行添加操作
        const result = await db.add(shelve);

        // 检查是否添加成功
        if (result > 0) {
            // 添加成功，返回201状态码和货架信息
            res.json(util.FormatJSONData(201, '货架新增成功', shelve));
        } else {
            // 添加失败，返回错误信息
            res.status(400).json(util.FormatJSONData(400, '货架新增失败', '没有货架被添加'));
        }
    } catch (error) {
        // 处理错误
        util.err(error);

        // 返回服务器内部错误响应
        res.status(500).json(util.FormatJSONData(500, '服务器内部错误', error));
    }
}

async function find(req, res){
    try{
        const id = req.params.id;
        const db = ShelvesDB.getInstance();
        if (id) {
            const result = await db.find(id);
            res.status(200).json(util.FormatJSONData(200, '查询成功', result));
        } else {
            res.status(400).json(util.FormatJSONData(400, '参数错误', null));
        }
    }catch(err){
         // 处理错误  
         util.err(err);  
  
         // 返回服务器内部错误响应  
         res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
}

async function findAllWithPagination(req, res) {  
    try {  
        // 检查分页参数  
        const pageNumber = parseInt(req.query.pageNumber, 10) || 1;  
        const pageSize = parseInt(req.query.pageSize, 10) || 10;  
        const sortOrder = req.query.sortOrder;
        const db = ShelvesDB.getInstance();
  
        // 验证页码和页大小  
        if (pageNumber <= 0) throw new Error('页码必须大于0');  
        if (pageSize <= 0) throw new Error('页大小必须大于0');  
  
        // 调用分页查询方法  
        const result = await db.findAllWithPagination(pageNumber, pageSize, sortOrder);  
  
        // 假设 util.FormatJSONData 是安全的并且返回了正确的JSON格式  
        res.status(200).json(util.FormatJSONData(200, '查询成功', result));  
    } catch (err) {  
        // 记录错误（但不要在生产环境中记录敏感信息）  
        util.err(err);  
  
        // 提取错误消息（避免暴露敏感或内部信息）  
        let errorMessage = '服务器内部错误';  
        if (err.message) {  
            errorMessage = err.message; // 仅当它不是敏感信息时  
        }  
  
        // 返回服务器内部错误响应  
        res.status(500).json(util.FormatJSONData(500, errorMessage, null)); // 不返回实际的错误对象  
    }  
}

async function findAll(req, res){
    try{
        const db = ShelvesDB.getInstance();
            const result = await db.findAll();
            res.status(200).json(util.FormatJSONData(200, '查询货架列表成功', result));
    }catch(err){
         // 处理错误  
         util.err(err);  
  
         // 返回服务器内部错误响应  
         res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
}



/**  
 * 修改货架  
 */  
async function update(req, res) {  
    try {  
        // 创建一个符合数据库模型的货架更新对象  
        // 注意：这里我们不需要warehouseZoneId和shelfNumber，除非它们也可以被更新  
        const shelf = { 
            warehouseZoneId: req.body.warehouseZoneId,
            shelfNumber: req.body.shelfNumber,
            layers: req.body.layers, 
            shelfType: req.body.shelfType,  
            shelfSize: req.body.shelfSize,  
            shelfCapacity: req.body.shelfCapacity,  
            shelfStatus: req.body.shelfStatus, 
            shelfLocation: req.body.shelfLocation,  
            description: req.body.description,  
            photoUrl: req.body.photoUrl,
            id: req.params.id
        };  
  
        // 获取数据库操作实例  
        const db = ShelvesDB.getInstance();  
  
        // 执行更新操作  
        // 假设 db.update 方法接受货架ID和更新数据作为参数  
        const result = await db.update(shelf);  
  
        // 检查是否更新成功  
        if (result.affectedRows > 0) {  
            // 更新成功，返回200状态码和可能的更新后货架信息（如果需要）  
            res.json(util.FormatJSONData(200, '货架更新成功', { message: '成功更新货架信息' })); // 或者返回更新后的货架对象  
        } else {  
            // 更新失败，返回错误信息  
            res.status(400).json(util.FormatJSONData(400, '货架更新失败', '没有货架信息被更新'));  
        }  
    } catch (error) {  
        // 处理错误  
        util.err(error);  
  
        // 返回服务器内部错误响应  
        res.status(500).json(util.FormatJSONData(500, '服务器内部错误', error));  
    }  
}

async function getCount(req, res){
    try{
      const db = ShelvesDB.getInstance();
      const count = await db.getCount();
      res.json(util.FormatJSONData(200, "获取货架数量成功", count));
  
    }catch(err){
      util.err(err);  
      // 返回服务器内部错误响应  
      res.status(500).json(util.FormatJSONData(500, '服务器内部错误', err));  
    }
  }

  async function remove(req, res){
    try{
        const db = ShelvesDB.getInstance();
        const id = req.params.id;
        const result = await db.remove(id);
        console.log(result)
        if(result.affectedRows > 0){
            res.status(200).json(util.FormatJSONData(200, '删除成功', result.affectedRows));
        }else{
            res.status(404).json(util.FormatJSONData(404, '删除失败', result));
        }
    }catch(err){
        res.status(500).json(util.FormatJSONData(500, '服务器错误', err));
    }
  }

  /**
   * 获取剩余货架单元容量
   */

module.exports = {
    // 导出add方法
    add,
    update,
    find,
    findAll,
    getCount,
    remove,
    findAllWithPagination
};
